package gemsa.modeles;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import javax.sql.DataSource;
import gemsa.beans.Projet;
import gemsa.beans.Client;
import gemsa.outils.GestionBaseDeDonnees;

/**
 * Classe ModeleProjet
 * @author Projet Dev Groupe 33
 * @version 1.0
 */

public class ModeleProjet 
{
	// Variables
	DataSource datasource=null;
	Connection connexion=null;
	ResultSet resultat=null;
	
	// Variables de pagination
	private int maxParPage;
	private int pageActuel;
	private int totalElement;
	private String champTri;
	private String typeTri;
	private String recherche;
	private String typerecherche;
	
	// Constructeur
	public ModeleProjet(DataSource datasource)
	{		
		this.datasource=datasource;
	}
	
	// Accesseurs 
	public int getMaxParPage() 
	{
		return maxParPage;
	}

	public int getPageActuel() 
	{
		return pageActuel;
	}

	public int getTotalElement() 
	{
		return totalElement;
	}
	
	public String getChampTri()
	{
		return champTri;
	}

	public String getRecherche()
	{
		return recherche;
	} 

	public String getTypeTri() 
	{
		return typeTri;
	}
	
	public String getTyperecherche() 
	{
		return typerecherche;
	} 
	
	
	// Ajouter un projet
	public int creerProjet(int idClient, Projet projet) 
	{
		// Variables
		PreparedStatement requete1=null;
		PreparedStatement requete2=null;
		PreparedStatement requete3=null;
		PreparedStatement requete4=null;
		PreparedStatement requete5=null;
		PreparedStatement requete6=null;
		PreparedStatement requete7=null;
		PreparedStatement requete8=null;
		PreparedStatement requete9=null;
		PreparedStatement requete10=null;
		PreparedStatement requete11=null;
		PreparedStatement requete12=null;
		PreparedStatement requete13=null;
		PreparedStatement requete14=null;
		
		String requeteStringProjet=null;
		String requeteStringFinancement=null;
		String requeteStringEquipement=null;
		String requeteStringPopulation=null;
		String requeteStringProfessionnelSante=null;
		String requeteStringProfessionnelSocio=null;
		String requeteStringPorteur=null;
		String requeteStringCentre=null;
		String requeteStringDomaine=null;
		String requeteStringTemps=null;
		String requeteStringFinalite=null;
		String requeteStringCaracteristique=null;
		String requeteStringSysteme=null;
		String requeteStringUtilisateur=null;
		
		int codeErreur1=0;
		int codeErreur2=0;
		int codeErreur3=0;
		int codeErreur4=0;
		int codeErreur5=0;
		int codeErreur6=0;
		int codeErreur7=0;
		int codeErreur8=0;
		int codeErreur9=0;
		int codeErreur10=0;
		int codeErreur11=0;
		int codeErreur12=0;
		int codeErreur13=0;
		int codeErreur14=0;

		
		try 
		{	
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Cr�ation de la requête
			requeteStringProjet="INSERT INTO projet(id_client, projetNom, dateDebut) VALUES (?,?,?)";
			requeteStringFinancement="INSERT INTO financement(id_projet, financementeuropeen, financementnational, financementregional, financementlocal, financementindustrie, financementassociation, financementautres) VALUES (?,?,?,?,?,?,?,?)";
			requeteStringEquipement="INSERT INTO equipement(id_projet, equipementSurPatient, equipementChezPatient, equipementInstitution, equipementCabinet, equipementStructureSoin, equipementTiers, equipementAutre) VALUES (?,?,?,?,?,?,?,?)";
			requeteStringPopulation="INSERT INTO population(id_projet, populationAll, populationEnfants, populationAdultes, populationSenior, populationHandicap, populationMalade, populationAutre) VALUES (?,?,?,?,?,?,?,?)";
			requeteStringProfessionnelSante="INSERT INTO professionnelSante(id_projet, professionnelSanteMedecin, professionnelSanteMedLiberal, professionnelSanteInfirmier, professionnelSanteAuxiliaire, professionnelSanteSageFemme, professionnelSanteAutre) VALUES (?,?,?,?,?,?,?)";
			requeteStringProfessionnelSocio="INSERT INTO professionnelSocio(id_projet, professionnelSocioAssistantVie, professionnelSocioGardeMalde, professionnelSocioKine, professionnelSocioAideSoignante, professionnelSocioAideMenagere, professionnelSocioPedicure, professionnelSocioAutre) VALUES (?,?,?,?,?,?,?,?)";
			requeteStringPorteur="INSERT INTO porteur(id_projet, porteurNom, porteurInstitution, porteurRegion) VALUES (?,?,?,?)";
			requeteStringCentre="INSERT INTO centre(id_projet, centreNom, centreNombre, centrePeriphNombre ) VALUES (?,?,?,?)";
			requeteStringDomaine="INSERT INTO domaine(id_projet, domaineConsultation, domaineSurveillance, domaineAssistance, domaineIntervention, domaineAutre) VALUES (?,?,?,?,?,?)";
			requeteStringTemps="INSERT INTO temps(id_projet, tempsVie, tempsMaturite, tempsFonctionnement, tempsActivite, tempsFrequence, tempsType) VALUES (?,?,?,?,?,?,?)";
			requeteStringFinalite="INSERT INTO finalite(id_projet, application, finalite) VALUES (?,?,?)";
			requeteStringCaracteristique="INSERT INTO caracteristique(id_projet, caracteristique, carac, patientNombre) VALUES (?,?,?,?)";
			requeteStringSysteme="INSERT INTO systeme(id_projet, besoinSysteme, apportSysteme, specialite ) VALUES (?,?,?,?)";
			requeteStringUtilisateur="INSERT INTO utilisateur(id_projet, utilisateurFinal) VALUES (?,?)";
			
			
			// Pr�paration de la requ�te requeteStringProjet
			requete1=connexion.prepareStatement(requeteStringProjet,PreparedStatement.RETURN_GENERATED_KEYS);
			requete1.setInt(1,idClient);
			String alpha=null;
			alpha=projet.getProjetNom();
			requete1.setString(2,(String)projet.getProjetNom());
			requete1.setString(3,(String)projet.getDateDebut());
//			requete1.setString(4,(String)projet.getDateModification());
//			requete1.setString(5,(String)projet.getTotalProjet());
//			requete1.setString(6,(String)projet.getEtatProjet());
			
			codeErreur1=requete1.executeUpdate();
			
			// On récupère l'id du nouveau projet
			resultat=requete1.getGeneratedKeys();
            if (resultat.next())
            {
            	projet.setId(Integer.parseInt(resultat.getString(1)));
            }
			
			// Pr�paration de la requ�te requeteStringFinancement
			requete2=connexion.prepareStatement(requeteStringFinancement);
			requete2.setInt(1,(int)projet.getId());
			requete2.setBoolean(2,(boolean)projet.getFinancement()[0]);
			requete2.setBoolean(3,(boolean)projet.getFinancement()[1]);
			requete2.setBoolean(4,(boolean)projet.getFinancement()[2]);
			requete2.setBoolean(5,(boolean)projet.getFinancement()[3]);
			requete2.setBoolean(6,(boolean)projet.getFinancement()[4]);
			requete2.setBoolean(7,(boolean)projet.getFinancement()[5]);
			requete2.setBoolean(8,(boolean)projet.getFinancement()[6]);
			
			// Pr�paration de la requ�te requeteStringEquipement
			requete3=connexion.prepareStatement(requeteStringEquipement);
			requete3.setInt(1,(int)projet.getId());
			requete3.setBoolean(2,(boolean)projet.getEquipement()[0]);
			requete3.setBoolean(3,(boolean)projet.getEquipement()[1]);
			requete3.setBoolean(4,(boolean)projet.getEquipement()[2]);
			requete3.setBoolean(5,(boolean)projet.getEquipement()[3]);
			requete3.setBoolean(6,(boolean)projet.getEquipement()[4]);
			requete3.setBoolean(7,(boolean)projet.getEquipement()[5]);
			requete3.setBoolean(8,(boolean)projet.getEquipement()[6]);
			
			// Pr�paration de la requ�te requeteStringPopulation
			requete4=connexion.prepareStatement(requeteStringPopulation);
			requete4.setInt(1,(int)projet.getId());
			requete4.setBoolean(2,(boolean)projet.getPopulation()[0]);
			requete4.setBoolean(3,(boolean)projet.getPopulation()[1]);
			requete4.setBoolean(4,(boolean)projet.getPopulation()[2]);
			requete4.setBoolean(5,(boolean)projet.getPopulation()[3]);
			requete4.setBoolean(6,(boolean)projet.getPopulation()[4]);
			requete4.setBoolean(7,(boolean)projet.getPopulation()[5]);
			requete4.setBoolean(8,(boolean)projet.getPopulation()[6]);
			
			// Pr�paration de la requ�te requeteStringProfessionnelSante
			requete5=connexion.prepareStatement(requeteStringProfessionnelSante);
			requete5.setInt(1,(int)projet.getId());
			requete5.setBoolean(2,(boolean)projet.getProfessionnelSante()[0]);
			requete5.setBoolean(3,(boolean)projet.getProfessionnelSante()[1]);
			requete5.setBoolean(4,(boolean)projet.getProfessionnelSante()[2]);
			requete5.setBoolean(5,(boolean)projet.getProfessionnelSante()[3]);
			requete5.setBoolean(6,(boolean)projet.getProfessionnelSante()[4]);
			requete5.setBoolean(7,(boolean)projet.getProfessionnelSante()[5]);
			
			// Pr�paration de la requ�te requeteStringProfessionnelSocio
			requete6=connexion.prepareStatement(requeteStringProfessionnelSocio);
			requete6.setInt(1,(int)projet.getId());
			requete6.setBoolean(2,(boolean)projet.getProfessionnelSocio()[0]);
			requete6.setBoolean(3,(boolean)projet.getProfessionnelSocio()[1]);
			requete6.setBoolean(4,(boolean)projet.getProfessionnelSocio()[2]);
			requete6.setBoolean(5,(boolean)projet.getProfessionnelSocio()[3]);
			requete6.setBoolean(6,(boolean)projet.getProfessionnelSocio()[4]);
			requete6.setBoolean(7,(boolean)projet.getProfessionnelSocio()[5]);
			requete6.setBoolean(8,(boolean)projet.getProfessionnelSocio()[6]);
			
			// Pr�paration de la requ�te requeteStringDomaine
			requete7=connexion.prepareStatement(requeteStringDomaine);
			requete7.setInt(1,(int)projet.getId());
			requete7.setBoolean(2,(boolean)projet.getDomaine()[0]);
			requete7.setBoolean(3,(boolean)projet.getDomaine()[1]);
			requete7.setBoolean(4,(boolean)projet.getDomaine()[2]);
			requete7.setBoolean(5,(boolean)projet.getDomaine()[3]);
			requete7.setBoolean(6,(boolean)projet.getDomaine()[4]);
			
			// Pr�paration de la requ�te requeteStringPorteur
			requete8=connexion.prepareStatement(requeteStringPorteur);
			requete8.setInt(1,(int)projet.getId());
			requete8.setString(2,(String)projet.getPorteurNom());
			requete8.setString(3,(String)projet.getPorteurInstitution());
			requete8.setString(4,(String)projet.getPorteurRegion());
			
			// Pr�paration de la requ�te requeteStringCentre
			requete9=connexion.prepareStatement(requeteStringCentre);
			requete9.setInt(1,(int)projet.getId());
			requete9.setString(2,(String)projet.getCentreNom());
			requete9.setString(3,(String)projet.getCentreNombre());
			requete9.setString(4,(String)projet.getCentrePeriphNombre());
			
			// Pr�paration de la requ�te requeteStringTemps
			requete10=connexion.prepareStatement(requeteStringTemps);
			requete10.setInt(1,(int)projet.getId());
			requete10.setString(2,(String)projet.getTempsVie());
			requete10.setString(3,(String)projet.getTempsMaturite());
			requete10.setString(4,(String)projet.getTempsFonctionnement());
			requete10.setString(5,(String)projet.getTempsActivite());
			requete10.setString(6,(String)projet.getTempsFrequence());
			requete10.setString(7,(String)projet.getTempsType());
			
			// Pr�paration de la requ�te requeteStringFinalite
			requete11=connexion.prepareStatement(requeteStringFinalite);
			requete11.setInt(1,(int)projet.getId());
			requete11.setString(2,(String)projet.getApplication());
			requete11.setString(3,(String)projet.getFinalite());
			
			// Pr�paration de la requ�te requeteStringCaracteristique
			requete12=connexion.prepareStatement(requeteStringCaracteristique);
			requete12.setInt(1,(int)projet.getId());
			requete12.setString(2,(String)projet.getCaracteristique());
			requete12.setString(3,(String)projet.getCarac());
			requete12.setString(4,(String)projet.getPatientNombre());
			
			// Pr�paration de la requ�te requeteStringSysteme
			requete13=connexion.prepareStatement(requeteStringSysteme);
			requete13.setInt(1,(int)projet.getId());
			requete13.setString(2,(String)projet.getBesoinSysteme());
			requete13.setString(3,(String)projet.getApportSysteme());
			requete13.setString(4,(String)projet.getSpecialite());

			// Pr�paration de la requête requeteStringUtilisateur
			requete14=connexion.prepareStatement(requeteStringUtilisateur);
			requete14.setInt(1,(int)projet.getId());
			requete14.setString(2,(String)projet.getUtilisateurFinal());
			
			// On vide le projet par sécurité
			projet=null;
			
			// Execution de la requ�te
			codeErreur2=requete2.executeUpdate();
			codeErreur3=requete3.executeUpdate();
			codeErreur4=requete4.executeUpdate();
			codeErreur5=requete5.executeUpdate();
			codeErreur6=requete6.executeUpdate();
			codeErreur7=requete7.executeUpdate();
			codeErreur8=requete8.executeUpdate();
			codeErreur9=requete9.executeUpdate();
			codeErreur10=requete10.executeUpdate();
			codeErreur11=requete11.executeUpdate();
			codeErreur12=requete12.executeUpdate();
			codeErreur13=requete13.executeUpdate();
			codeErreur14=requete14.executeUpdate();

		}
		catch (Exception e) 
		{
			codeErreur1=0;
			System.out.println("Erreur dans la requete dans la classe ModeleProjet.java fonction creerProjet");
			e.printStackTrace();
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete1!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete1);
				}
				if(requete2!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete2);
				}
				if(requete3!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete3);
				}
				if(requete4!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete4);
				}
				if(requete5!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete5);
				}
				if(requete6!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete6);
				}
				if(requete7!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete7);
				}
				if(requete8!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete8);
				}
				if(requete9!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete9);
				}
				if(requete10!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete10);
				}
				if(requete11!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete11);
				}
				if(requete12!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete12);
				}
				if(requete13!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete13);
				}
				if(requete14!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete14);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de données dans la classe ModeleProjet fonction creerProjet");
			}	
		}
		
		// Retourne le code d'erreur
		return codeErreur1;
	}

	
	// Retourner la liste des projets
	public List<Projet> listerProjet(int idClient, int maxParPage, int pageActuel, String champTri, String typeTri)
	{	
		// Variables
		PreparedStatement requete=null;
		Projet projet=null;
		String requeteString=null;
		List<Projet> listeProjet=new ArrayList<Projet>();
		int position=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
		
			// Première requête : on r�cup�re le nombre total de projets passés par le client
			requeteString="SELECT COUNT(DISTINCT(projet.id_projet)) as total FROM projet WHERE id_client IN (SELECT id_clientprojet FROM clientprojet WHERE referenceclient = ?)";
			
			// On prépare la requête
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1,idClient);
				
			// Execution de la requête
			resultat=requete.executeQuery();
			
			// On récupère le nombre de projets du client
			if(resultat!=null)
			{
				if(resultat.next())
				{
					this.totalElement=resultat.getInt("total");
				}
			}
			
			// On v�rifie que la page demand�e est valable
			position=maxParPage*(pageActuel-1);
			if(position>totalElement || maxParPage>totalElement)
			{
				pageActuel=1;
			}
			
			// On d�finit les variables de pagination finales
			position=maxParPage*(pageActuel-1);
			this.maxParPage=maxParPage;
			this.pageActuel=pageActuel;
			this.champTri=champTri;
			this.typeTri=typeTri;
			
			// Deuxi�me requête : on r�cup�re la liste suivant une pagination
			requeteString = "SELECT * FROM projet WHERE id_client IN (SELECT id_clientprojet FROM clientprojet WHERE referenceclient = ?) ORDER BY " + champTri + " " + typeTri + " LIMIT " + position + " OFFSET " + maxParPage;
				
			// On pr�pare la requête
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1,idClient);
			
			// Execution de la requête
			resultat=requete.executeQuery();

			// On stocke le resultat dans une liste de projets
			if(resultat!=null)
			{
				while(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					projet=projetAttributsMapper(resultat);
					
					// Ajoute l'objet a la liste de projet
					listeProjet.add(projet);
				}
			}
		}
		catch(Exception e)
		{
			System.out.println(e);
			System.out.println("Erreur dans la requete dans la classe ModeleProjet fonction listerProjet");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleProjet fonction listerProjet");
			}	
		}
		
		// Retourner la liste des projets
		return listeProjet;
	}
	
	
	
	
	
	// Consulter un projet d'un client
	public Projet consulterProjet(int idClient, int idProjet)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		Projet projet=null;
		
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
		
			// On créé la requête
			requeteString="SELECT * FROM projet WHERE id_client IN (SELECT id_clientprojet FROM clientprojet WHERE referenceclient = ?) AND id_projet = ?";
			
			// On prépare la requête
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1,idClient);
			requete.setInt(2, idProjet);
				
			// Execution de la requête
			resultat=requete.executeQuery();
			
			// On récupère le projet du client
			if(resultat!=null)
			{
				if(resultat.next())
				{
					projet=projetAttributsMapper(resultat);
				}
			}
		}
		catch(Exception e)
		{
			projet =null;
			System.out.println("Erreur dans la requete dans la classe ModeleProjet fonction consulterProjet");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de données dans la classe ModeleProjet fonction consulterProjet");
			}	
		}
		
		// Retourner le projet du client
		return projet;
	}
	
	
	
	
	
	// Ajouter un projet
	public int ajouterProjet(Projet projet,int idClient)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		ModeleLigneProjet modeleLigneProjet=null;
		SimpleDateFormat format=new SimpleDateFormat("yyyyMMdd");
		int codeErreur=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Annulation de l'autocommit
			connexion.setAutoCommit(false);
			
			// Création de la requête
			requeteString="INSERT INTO projet (id_client,datecreationprojet,datemodificationprojet,totalprojet,etatprojet) VALUES(?,?,?,?,?)";
			
			// Pr�paration de la requête
			requete=connexion.prepareStatement(requeteString,PreparedStatement.RETURN_GENERATED_KEYS);
			requete.setInt(1, idClient);
			requete.setInt(2, Integer.parseInt(format.format(projet.getDateCreation())));
			requete.setInt(3, Integer.parseInt(format.format(projet.getDateModification())));
			requete.setDouble(4, projet.getTotal()); 
			requete.setInt(6, projet.getEtat());
			
			// Execution de la requête
			codeErreur=requete.executeUpdate();
			
			// Si l'ajout s'est déroulé avec succès on ajoute les lignes du projet
			if(codeErreur==1)
			{
				// On récupère l'id du nouveau projet
				resultat=requete.getGeneratedKeys();
	            if (resultat.next())
	            {
	            	projet.setId(Integer.parseInt(resultat.getString(1)));
	            }
	            
	            // Initialisation du modèle ligneProjet
	            modeleLigneProjet=new ModeleLigneProjet(this.datasource);
	            
	            // On ajoute les lignes du projet
	            codeErreur=modeleLigneProjet.ajouterListeLigneProjet(projet.getListeLigneProjet(), projet.getId());
			}
			
			// Si il y a une erreur durant l'ajout des lignes ou du projet en base, on fait un rollback
			if(codeErreur!=1)
			{
				GestionBaseDeDonnees.rollback(connexion);
			}
			else
			{
				GestionBaseDeDonnees.commit(connexion);
			}
			
			// On vide projet par sécurité
			projet=null;
		}
		catch(Exception e)
		{
			codeErreur=0;
			System.out.println(e);
			GestionBaseDeDonnees.rollback(connexion);
			System.out.println("Erreur dans la requete dans la classe ModeleProjet fonction ajouterProjet");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleProjet fonction ajouterProjet");
			}	
		}
		
		// Retourner le code d'erreur
		return codeErreur;
	}
	
	
	
	
	
	// Modifier un projet
	public int modifierProjet(Projet projet)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		SimpleDateFormat format=new SimpleDateFormat("yyyyMMdd");
		ModeleClientProjet modeleClientProjet=null;
		int codeErreur=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Annulation de l'autocommit
			connexion.setAutoCommit(false);
			
			// Création de la requête
			requeteString="UPDATE projet SET etatprojet = ?, datemodificationprojet = ? WHERE id_projet = ?";
			
			// Pr�paration de la requête
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1, projet.getEtat());
			requete.setInt(2, Integer.parseInt(format.format(projet.getDateModification())));
			requete.setInt(3, projet.getId());
			
			// Execution de la requête
			codeErreur=requete.executeUpdate();
			
			// Si l'ajout s'est déroulé avec succès on modifie la fiche de renseignements
			if(codeErreur==1)
			{
	            // Initialisation du modèle
	            modeleClientProjet=new ModeleClientProjet(this.datasource);
	            
	            // On modifie la fiche de renseignements
	            codeErreur=modeleClientProjet.modifierRenseignements(projet.getClient());
			}
			
			// Si il y a une erreur durant la modification du projet ou de l'adresse de livraison en base, on fait un rollback
			if(codeErreur!=1)
			{
				GestionBaseDeDonnees.rollback(connexion);
			}
			else
			{
				GestionBaseDeDonnees.commit(connexion);
			}
			
			// On vide projet par sécurité
			projet=null;
		}
		catch(Exception e)
		{
			codeErreur=0;
			System.out.println(e);
			GestionBaseDeDonnees.rollback(connexion);
			System.out.println("Erreur dans la requete dans la classe ModeleProjet fonction modifierProjet");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de données dans la classe ModeleProjet fonction modifierProjet");
			}	
		}
		
		// Retourner le code d'erreur
		return codeErreur;
	}
	
	
	
	
	
	// Retourner le nombre de projets en attente
	public int getNombreProjetEnAttente(int idClient)
	{
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		int total=0;
		
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
		
			// On créé la requête
			requeteString="SELECT count(*) as total FROM projet WHERE id_client IN (SELECT id_clientprojet FROM clientprojet WHERE referenceclient = ?) AND etatprojet = 0";
			
			// On prépare la requête
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1,idClient);
				
			// Execution de la requête
			resultat=requete.executeQuery();
			
			// On récupère le projet du client
			if(resultat!=null)
			{
				if(resultat.next())
				{
					// Si le client n'a pas encore passé de projet, on passe le total de projet à 0
					if(resultat.getString("total")==null)
					{
						total=0;
					}
					else
					{
						total=resultat.getInt("total");
					}
				}
			}
		}
		catch(Exception e)
		{
			total=0;
			System.out.println("Erreur dans la requete dans la classe ModeleProjet fonction getNombreProjetEnAttente");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleProjet fonction getNombreProjetEnAttente");
			}	
		}
		
		// Retourner le nombre de projet
		return total;
	}
	
	
	
	
	
	
	
	/* ======================
	 * Partie admin
	 * ======================
	 */
	
	
	// Retourner la liste des projets
	public List<Projet> listerProjet (int maxParPage, int pageActuel, String recherche, String typerecherche, String champTri, String typeTri)
	{	
		// Variables
		PreparedStatement requete=null;
		Projet projet=null;
		String requeteString=null;
		List<Projet> listeProjets=new ArrayList<Projet>();
		int position=0;
	
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
			
			// Première requête : on récupère le nombre total de projets
			requeteString="SELECT COUNT(DISTINCT(projet.id_projet)) as total FROM projet,clientprojet WHERE projet.id_client = clientprojet.id_clientprojet";
			
			// Si il s'agit d'une recherche, on modifie la requête en cons�quence
			if((recherche!=null && !recherche.equalsIgnoreCase("")) && (typerecherche!=null && !typerecherche.equals("")))
			{
				requeteString+=" AND " + typerecherche + " like ?";
				
				// Pr�paration de la requête
				requete=connexion.prepareStatement(requeteString);
				requete.setString(1,"%" + recherche + "%");
			}
			// Dans le cas contraire on prend en compte tous les clients
			else
			{ 
				// Préparation de la requête
				requete=connexion.prepareStatement(requeteString);
			}
			
			// Execution de la requête
			resultat=requete.executeQuery();
			
			// On récupère le nombre de projets
			if(resultat!=null)
			{
				if(resultat.next())
				{
					this.totalElement=resultat.getInt("total");
				}
			}
			
			// On vérifie que la page demandée est valable
			position=maxParPage*(pageActuel-1);
			if(position>totalElement || maxParPage>totalElement)
			{
				// On modifie les variables de pagination envoy�es dans la requête
				pageActuel=1;
			}
			
			// On d�finit les variables de pagination finales
			position=maxParPage*(pageActuel-1);
			this.maxParPage=maxParPage;
			this.pageActuel=pageActuel;
			this.recherche=recherche;
			this.champTri=champTri;
			this.typeTri=typeTri;
			this.typerecherche=typerecherche;
		
			// Deuxi�me requête : on r�cup�re la liste suivant une pagination
			
			// Création de la requête
			requeteString="SELECT * FROM projet,clientprojet WHERE projet.id_client = clientprojet.id_clientprojet";
			
			// Si il s'agit d'une recherche, on modifie la requête en cons�quence
			if((recherche!=null && !recherche.equalsIgnoreCase("")) && (typerecherche!=null && !typerecherche.equals("")))
			{
				requeteString+=" AND " + typerecherche + " like ?";
				requeteString+=" ORDER BY " + champTri + " " + typeTri + " LIMIT " + position + "," + maxParPage;
				
				// Préparation de la requête
				requete=connexion.prepareStatement(requeteString);
				requete.setString(1,"%" + recherche + "%");
			}
			// Dans le cas contraire on liste toutes les projets
			else
			{ 
				requeteString+=" ORDER BY " + champTri + " " + typeTri + " LIMIT " + position + "," + maxParPage;
				
				// Pr�paration de la requête
				requete=connexion.prepareStatement(requeteString);
			 }
	
			// Execution de la requête
			resultat=requete.executeQuery();

			// On stocke le resultat dans une liste
			if(resultat!=null)
			{
				while(resultat.next())
				{
					// On effectue le mapping des attributs avec les champs de la table SQL
					projet=projetAttributsMapper(resultat);
					
					// Ajoute l'objet a la liste des projets
					listeProjets.add(projet);
				}
			}
		}
		catch(Exception e)
		{
			System.out.println(e);
			System.out.println("Erreur dans la requete dans la classe ModeleProjet fonction listeProjet");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleProjet fonction listeProjet");
			}	
		}
		
		// Retourner la liste des projets
		return listeProjets;
	}

	
	// Consulter un projet
	public Projet consulterProjet(int idProjet)
	{	
		// Variables
		PreparedStatement requete=null;
		String requeteString=null;
		Projet projet=null;
		
		try
		{			
			// Ouverture d'une connexion
			connexion=datasource.getConnection();
		
			// On créé la requête
			requeteString="SELECT * FROM projet WHERE id_projet = ?";
			
			// On prépare la requête
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1, idProjet);
				
			// Execution de la requête
			resultat=requete.executeQuery();
			
			// On récupère le projet du client
			if(resultat!=null)
			{
				if(resultat.next())
				{
					projet=projetAttributsMapper(resultat);
				}
			}
		}
		catch(Exception e)
		{
			projet=null;
			System.out.println("Erreur dans la requete dans la classe ModeleProjet fonction consulterProjet");
		}
		finally
		{
			try
			{
				// Fermeture de la connexion
				if(resultat!=null)
				{
					GestionBaseDeDonnees.closeResulset(resultat);
				}
				if(requete!=null)
				{
					GestionBaseDeDonnees.closeRequest(requete);
				}
				if(connexion!=null)
				{
					GestionBaseDeDonnees.closeConnection(connexion);
				}
			}
			catch(Exception ex)
			{
				System.out.println("Erreur lors de la fermeture de la connexion avec la base de donn�es dans la classe ModeleProjet fonction consulterProjet");
			}	
		}
		
		// Retourner le projet du client
		return projet;
	}
	
	
	// Réaliser la transformation Relationnel vers Objet
	private Projet projetAttributsMapper(ResultSet resultat)
	{
		// Variables
		Projet projet=null;
		SimpleDateFormat dateFormat=null;
		ModeleClientProjet modeleClientProjet=null;
		ModeleLigneProjet modeleLigneProjet=null;
		
		// Initialisation du modèle
		modeleClientProjet=new ModeleClientProjet(this.datasource);
		modeleLigneProjet=new ModeleLigneProjet(this.datasource);
		
		// Initalisation de l'objet projet
		projet=new Projet();
		
		// Initialisation du format de la date
		dateFormat=new SimpleDateFormat("yyyyMMdd");
		
		try
		{	
			// On renseigne l'objet projet
			if(resultat.getString("id_projet")==null)
			{
				projet.setId(0);
			}
			else
			{
				projet.setId(resultat.getInt("id_projet"));
			}
			
			if(resultat.getString("id_client")==null)
			{
				projet.setClient(new Client());
			}
			else
			{
				projet.setClient(modeleClientProjet.getClient(resultat.getInt("id_client")));
			}
			
			if(resultat.getString("datecreationprojet")==null)
			{
				
				projet.setDateCreation(dateFormat.parse(""));
			}
			else
			{
				projet.setDateCreation(dateFormat.parse(resultat.getString("datecreationprojet")));
			}
			
			if(resultat.getString("datemodificationprojet")==null)
			{
				
				projet.setDateModification(dateFormat.parse(""));
			}
			else
			{
				projet.setDateModification(dateFormat.parse(resultat.getString("datemodificationprojet")));
			}
			
			if(resultat.getString("totalprojet")==null)
			{
				
				projet.setTotal(0);
			}
			else
			{
				projet.setTotal(resultat.getDouble("totalprojet"));
			}
			
			if(resultat.getString("etatprojet")==null)
			{
				
				projet.setEtat(0);
			}
			else
			{
				projet.setEtat(resultat.getInt("etatprojet"));
			}
			
			// On récupère la liste des lignes du projet
			projet.setListeLigneProjet(modeleLigneProjet.listerLigneProjet(projet.getId()));
		}
		catch (Exception e) 
		{
			// S'il y a une erreur durant le mapping des attributs avec la base on renvoie un objet null
			projet=null;
			System.out.println("Erreur lors du mappage des attributs d'un projet dans la classe ModeleProjet fonction projetAttributsMapper");
		}
		
		// On retourne le projet
		return projet;
	}
	
}
